package com.sd365.permission.centre.service;


import com.sd365.permission.centre.entity.Department;
import com.sd365.permission.centre.entity.Position;
import com.sd365.permission.centre.entity.Role;
import com.sd365.permission.centre.entity.User;
import com.sd365.permission.centre.pojo.dto.UserDTO;
import com.sd365.permission.centre.pojo.query.UserQuery;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

import javax.validation.Valid;
import java.util.List;

/**
 * @author 史旭升
 * @version 1.0.0
 * @class UserService
 * @classdesc 维护用户信息的服务接口
 * @date 2022-12-27  21:12
 * @see
 * @since
 */
public interface UserService {
    /**
     *版本
     */
    long INITIALIZE_VERSION_VALUE=1;
    /**
     * @Description: 用户管理界面增加
     * 异常：参数userDTO不能为null，code不能重复
     * @Author: shixusheng
     * @DATE: 2022-12-27  21:12
     * @param: userDto
     * @return: boolean true 添加用户成功，false添加失败
     */
    @Transactional(rollbackFor = Exception.class)
    Boolean add(@RequestBody @Valid UserDTO userDTO);
    /**
     * @param: 删除用户，若有对应角色则中间表用户-角色也需一并删除
     * 异常：id不能为空且user必须存在
     * @return: 成功则true
     * @DATE: 2022-12-27  11:15
     * @param: Long id, Long version
     */
    @Transactional(rollbackFor = Exception.class)
    Boolean remove(Long id, Long version);
    /**
     *修改用户
     * @author shi xusheng
     * 异常：userDTO不能为null，其属性id也不能为null
     * @date 2022/12/27 11:45
     * @param userDTO
     * @return java.lang.Boolean true修改用户信息成功，false失败
     */
    @Transactional(rollbackFor = Exception.class)
    Boolean modify(UserDTO userDTO);
    /**
     *修改用户角色(分配角色,覆盖原有角色)
     * 异常：userDTOS数组不能为空 为null
     * @author shi xusheng
     * @date 2022/12/28 12:36
     * @param userDTOS
     * @return java.lang.Boolean true 用户角色修改成功，false修改失败
     */
    @Transactional(rollbackFor = Exception.class)
    Boolean modifyWithNewRole(UserDTO[] userDTOS);
    /**
     *查询用户
     * 异常：userQuery不能为null
     * @author shi xusheng
     * @date 2022/12/30 2:37
     * @param userQuery
     * @return java.util.List<com.sd365.permission.centre.entity.User>
     */
    List<User> commonQuery(UserQuery userQuery);
    /**
     *查询用户通过id，复制时查询对应数据回显
     * 异常：id不能为null，id对应的用户必须存在
     * @author shi xusheng
     * @date 2022/12/30 22:38
     * @param id
     * @return com.sd365.permission.centre.pojo.vo.UserVO
     */
    User queryById(Long id);
    /**
     *查询所有角色
     * @author shi xusheng
     * @date 2022/12/28 21:39
     * @return java.util.List<com.sd365.permission.centre.entity.Role>
     */
    List<Role> queryAllRole();
    /**
     *查询所有部门
     * @author shi xusheng
     * @date 2022/12/28 22:39
     * @return java.util.List<com.sd365.permission.centre.entity.Department>
     */
    List<Department> queryAllDepartment();
    /**
     *查询所有职业
     * @author shi xusheng
     * @date 2022/12/29 22:40
     * @return java.util.List<com.sd365.permission.centre.entity.Position>
     */
    List<Position> queryAllPosition();
    /**
     *批量修改用户（(启停控制)
     * 异常：数组userDTOS不能为空为null
     * @author shi xusheng
     * @date 2022/12/29 10:41
     * @param userDTOS
     * @return java.lang.Boolean true用户状态修改成功。false状态修改失败
     */
    @Transactional(rollbackFor = Exception.class)
    Boolean batchUpdate(UserDTO[] userDTOS);
    /**
     *批量删除
     * 异常：数组userDTOS不能为空为null
     * @author shi xusheng
     * @date 2022/12/28 15:42
     * @param userDTOS
     * @return java.lang.Boolean true：批量修改成功，fasle失败 事务回滚
     */
    @Transactional(rollbackFor = Exception.class)
    Boolean batchDelete(UserDTO[] userDTOS);
    /**
     * md5,没有用到该接口，使用的是工具类
     * @return boolean
     */
    Boolean firstStartMd5();
    /**
     *重新更新密码，本次培训项目不需要实现这个
     * @author shi xusheng
     * @date 2022/12/27 15:45
     * @param userDTO
     * @return java.lang.Boolean
     */
    Boolean updatePassword(UserDTO userDTO);
    /**
     *找回密码
     * 异常：密码不能为null或“”
     * @author shi xusheng
     * @date 2022/12/30 22:49
     * @param code
     * @return com.sd365.permission.centre.entity.User
     */
    User getUser(String code );
}
